#!/bin/bash

# DataLink Java 23 启动脚本
# 此脚本包含了在Java 23环境下启动DataLink所需的所有JVM参数

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $1"
}

# 检查Java版本
check_java_version() {
    log_info "检查Java版本..."
    
    if ! command -v java &> /dev/null; then
        log_error "Java未安装或不在PATH中"
        exit 1
    fi
    
    JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2 | cut -d'.' -f1)
    log_info "检测到Java版本: $JAVA_VERSION"
    
    if [ "$JAVA_VERSION" -lt 23 ]; then
        log_warn "建议使用Java 23或更高版本，当前版本: $JAVA_VERSION"
    else
        log_info "Java版本检查通过"
    fi
}

# 设置JVM参数
setup_jvm_args() {
    log_info "配置Java 23 JVM参数..."
    
    # 基础模块开放参数
    BASE_OPENS="--add-opens java.base/java.nio=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/sun.nio.ch=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.lang=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.util=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.lang.reflect=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.text=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.time=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.util.concurrent=ALL-UNNAMED"
    BASE_OPENS="$BASE_OPENS --add-opens java.base/java.net=ALL-UNNAMED"
    
    # 桌面模块开放参数
    DESKTOP_OPENS="--add-opens java.desktop/java.awt.font=ALL-UNNAMED"
    DESKTOP_OPENS="$DESKTOP_OPENS --add-opens java.desktop/java.awt=ALL-UNNAMED"
    
    # 管理模块开放参数
    MANAGEMENT_OPENS="--add-opens java.management/sun.management=ALL-UNNAMED"
    
    # GC配置
    GC_ARGS="-XX:+UseG1GC"
    GC_ARGS="$GC_ARGS -XX:MaxGCPauseMillis=200"
    GC_ARGS="$GC_ARGS -XX:+UnlockExperimentalVMOptions"
    
    # 内存配置
    MEMORY_ARGS="-Xms2g -Xmx8g"
    MEMORY_ARGS="$MEMORY_ARGS -XX:MetaspaceSize=256m"
    MEMORY_ARGS="$MEMORY_ARGS -XX:MaxMetaspaceSize=512m"
    
    # Spring Boot 3.x Java 23兼容性参数
    SPRING_ARGS="-Dspring.classformat.ignore=true"

    # 组合所有JVM参数
    JVM_ARGS="$BASE_OPENS $DESKTOP_OPENS $MANAGEMENT_OPENS $GC_ARGS $MEMORY_ARGS $SPRING_ARGS"
    
    log_debug "JVM参数: $JVM_ARGS"
}

# 设置应用程序参数
setup_app_args() {
    log_info "配置应用程序参数..."
    
    # 默认配置
    SERVER_PORT=${SERVER_PORT:-8081}
    SPRING_PROFILE=${SPRING_PROFILE:-dev}
    PERSISTENCE_TYPE=${PERSISTENCE_TYPE:-file}
    
    # PostgreSQL配置（如果使用postgres持久化）
    if [ "$PERSISTENCE_TYPE" = "postgres" ]; then
        POSTGRES_HOST=${POSTGRES_HOST:-localhost}
        POSTGRES_PORT=${POSTGRES_PORT:-5432}
        POSTGRES_DB=${POSTGRES_DB:-datalink}
        POSTGRES_USER=${POSTGRES_USER:-datalink}
        POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-datalink}
        
        APP_ARGS="--server.port=$SERVER_PORT"
        APP_ARGS="$APP_ARGS --spring.profiles.active=$SPRING_PROFILE"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.storage.type=$PERSISTENCE_TYPE"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.postgres.host=$POSTGRES_HOST"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.postgres.port=$POSTGRES_PORT"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.postgres.database=$POSTGRES_DB"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.postgres.username=$POSTGRES_USER"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.postgres.password=$POSTGRES_PASSWORD"
    else
        APP_ARGS="--server.port=$SERVER_PORT"
        APP_ARGS="$APP_ARGS --spring.profiles.active=$SPRING_PROFILE"
        APP_ARGS="$APP_ARGS -Ddatalink.persistence.storage.type=$PERSISTENCE_TYPE"
    fi
    
    log_debug "应用参数: $APP_ARGS"
}

# 编译项目
compile_project() {
    log_info "编译DataLink项目..."
    
    if [ ! -f "pom.xml" ]; then
        log_error "未找到pom.xml文件，请在项目根目录运行此脚本"
        exit 1
    fi
    
    log_info "运行Maven编译..."
    mvn clean compile -DskipTests -q
    
    if [ $? -eq 0 ]; then
        log_info "项目编译成功"
    else
        log_error "项目编译失败"
        exit 1
    fi
}

# 启动DataLink Web服务
start_datalink_web() {
    log_info "启动DataLink Web服务..."
    
    cd datalink-web
    
    # 构建classpath
    CLASSPATH="target/classes:$(mvn dependency:build-classpath -Dmdep.outputFile=/dev/stdout -q)"
    
    log_info "启动参数:"
    log_info "  服务端口: $SERVER_PORT"
    log_info "  Spring Profile: $SPRING_PROFILE"
    log_info "  持久化类型: $PERSISTENCE_TYPE"
    
    if [ "$PERSISTENCE_TYPE" = "postgres" ]; then
        log_info "  PostgreSQL: $POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB"
    fi
    
    log_info "正在启动DataLink服务..."
    
    # 启动应用
    java $JVM_ARGS -cp "$CLASSPATH" com.leon.datalink.web.Datalink $APP_ARGS
}

# 主函数
main() {
    log_info "=== DataLink Java 23 启动脚本 ==="
    log_info "版本: 1.0.0"
    log_info "支持: Java 23+ with GraalVM"
    echo
    
    # 检查Java版本
    check_java_version
    
    # 设置JVM参数
    setup_jvm_args
    
    # 设置应用参数
    setup_app_args
    
    # 编译项目
    compile_project
    
    # 启动服务
    start_datalink_web
}

# 帮助信息
show_help() {
    echo "DataLink Java 23 启动脚本"
    echo
    echo "用法: $0 [选项]"
    echo
    echo "选项:"
    echo "  -h, --help              显示此帮助信息"
    echo "  -p, --port PORT         设置服务端口 (默认: 8081)"
    echo "  --profile PROFILE       设置Spring Profile (默认: dev)"
    echo "  --persistence TYPE      设置持久化类型 (file|postgres, 默认: file)"
    echo "  --postgres-host HOST    PostgreSQL主机 (默认: localhost)"
    echo "  --postgres-port PORT    PostgreSQL端口 (默认: 5432)"
    echo "  --postgres-db DB        PostgreSQL数据库 (默认: datalink)"
    echo "  --postgres-user USER    PostgreSQL用户 (默认: datalink)"
    echo "  --postgres-pass PASS    PostgreSQL密码 (默认: datalink)"
    echo
    echo "环境变量:"
    echo "  SERVER_PORT             服务端口"
    echo "  SPRING_PROFILE          Spring Profile"
    echo "  PERSISTENCE_TYPE        持久化类型"
    echo "  POSTGRES_HOST           PostgreSQL主机"
    echo "  POSTGRES_PORT           PostgreSQL端口"
    echo "  POSTGRES_DB             PostgreSQL数据库"
    echo "  POSTGRES_USER           PostgreSQL用户"
    echo "  POSTGRES_PASSWORD       PostgreSQL密码"
    echo
    echo "示例:"
    echo "  $0                                    # 使用默认配置启动"
    echo "  $0 -p 8080 --profile prod            # 指定端口和环境"
    echo "  $0 --persistence postgres             # 使用PostgreSQL持久化"
    echo
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -h|--help)
            show_help
            exit 0
            ;;
        -p|--port)
            SERVER_PORT="$2"
            shift 2
            ;;
        --profile)
            SPRING_PROFILE="$2"
            shift 2
            ;;
        --persistence)
            PERSISTENCE_TYPE="$2"
            shift 2
            ;;
        --postgres-host)
            POSTGRES_HOST="$2"
            shift 2
            ;;
        --postgres-port)
            POSTGRES_PORT="$2"
            shift 2
            ;;
        --postgres-db)
            POSTGRES_DB="$2"
            shift 2
            ;;
        --postgres-user)
            POSTGRES_USER="$2"
            shift 2
            ;;
        --postgres-pass)
            POSTGRES_PASSWORD="$2"
            shift 2
            ;;
        *)
            log_error "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
done

# 运行主函数
main
